package library;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import com.google.android.gms.internal.cd;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
 
public class UserFunctions {
 
    private JSONParser jsonParser;
 
    private static String URL = "http://192.168.0.101/webServiceAndroidApp/index.php";
    private static String URL_IMG = "http://192.168.0.101/webServiceAndroidApp/images/";
 
    private static String login_tag = "login";
    private static String register_tag = "register";
    private static String lista_tag= "lista_publicaciones";
    private static String agregarPub_tag= "agregar_publicacion";
    private static String subirImg_tag= "subir_imagen";
    private static String subirUbi_tag= "subir_ubicacion";
    private static String getPub_tag= "obtener_publicacion";
    private static String addRemFav_tag= "favoritos";
    private static String getUb_tag= "obtener_ubicacion";
    private static String busqueda_tag= "buscar";
    private static String favoritos_tag= "lista_favoritos";
    private static String misPublicaciones_tag= "lista_misPublicaciones";
    private static String editarPub_tag= "editar_publicacion";
    private static String editarUsuario_tag= "editar_usuario";
 
    // constructor
    public UserFunctions(){
        jsonParser = new JSONParser();
    }
 
    /**
     * funcion para hacer Login
     * @param email
     * @param password
     * */
    public JSONObject loginUser(String nombre_usuario, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", login_tag));
        params.add(new BasicNameValuePair("nombre_usuario", nombre_usuario));
        params.add(new BasicNameValuePair("password", password));
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        // return json
        // Log.e("JSON", json.toString());
        return json;
    }
 
    
     //* registrar usuario
    public JSONObject registerUser(String nombre, String nombre_usuario, String telefono, String fecha_nacimiento, String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", register_tag));
        params.add(new BasicNameValuePair("nombre", nombre));
        params.add(new BasicNameValuePair("nombre_usuario", nombre_usuario));
        params.add(new BasicNameValuePair("telefono", telefono));
        params.add(new BasicNameValuePair("fecha_nacimiento", fecha_nacimiento));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
 
        // pidiendo JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        // return json
        return json;
    }
    
  //* editar usuario
    public JSONObject updateUser(Context context, String nombre, String telefono, String email, String password, String passwordNueva, Boolean cambioPass){
    	DatabaseHandler db = new DatabaseHandler(context);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
        params.add(new BasicNameValuePair("tag", editarUsuario_tag));
        params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("nombre", nombre));
        params.add(new BasicNameValuePair("telefono", telefono));
        params.add(new BasicNameValuePair("email", email));
        if (cambioPass) {
        	params.add(new BasicNameValuePair("password", password));
        	params.add(new BasicNameValuePair("passwordNueva", passwordNueva));
        	params.add(new BasicNameValuePair("cambioPass", "true"));
		}
        else{
        	params.add(new BasicNameValuePair("cambioPass", "false"));
        }
 
        // pidiendo JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        // return json
        return json;
    }
 
    /**
     * Funcion estatus de login
     * */
    public boolean isUserLoggedIn(Context context){
        DatabaseHandler db = new DatabaseHandler(context);
        int count = db.getRowCount();
        if(count > 0){
            // usuario inicio sesion
            return true;
        }
        return false;
    }
 
    /**
     * Funcion logout user
     * Eliminar bd
     * */
    public boolean logoutUser(Context context){
        DatabaseHandler db = new DatabaseHandler(context);
        db.resetTables();
        return true;
    }
    
    /**
     * Funcion lista de publicaciones
     * pide publkicaciones por pagina
     * */
    public JSONObject listPublicaciones(Context context, Integer pagina){
    	DatabaseHandler db = new DatabaseHandler(context);
    	List<NameValuePair> params = new ArrayList<NameValuePair>();
    	HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
    	params.add(new BasicNameValuePair("tag", lista_tag));
        params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("pagina", ""+pagina));
        
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        
        return json;
    	
    }
    
    /**
     * Funcion busqued
     * pide publicaciones por pagina y detalles
     * */
    public JSONObject listBusqueda(Context context, Integer pagina, Integer tipo, Integer ciudad, Integer precio){
    	DatabaseHandler db = new DatabaseHandler(context);
    	List<NameValuePair> params = new ArrayList<NameValuePair>();
    	HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
    	params.add(new BasicNameValuePair("tag", busqueda_tag));
        params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("tipo", ""+tipo));
        params.add(new BasicNameValuePair("ciudad", ""+ciudad));
        params.add(new BasicNameValuePair("precio", ""+precio));
        params.add(new BasicNameValuePair("pagina", ""+pagina));
        
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        
        return json;
    	
    }
    
    
    /**
     * Funcion agregar publicacion
     * envia info de publicacion
     * */
    public JSONObject agregarPub(Context context, String titulo, String descripcion, String tipo, String tiempo, String ciudad, String direccion, String precio){
        // Building Parameters
    	DatabaseHandler db=new DatabaseHandler(context);
    	HashMap<String, String> user=new HashMap<String, String>();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        user=db.getUserDetails();
        params.add(new BasicNameValuePair("tag", agregarPub_tag));
        params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("titulo", titulo));
        params.add(new BasicNameValuePair("descripcion", descripcion));
        params.add(new BasicNameValuePair("tipo", tipo));
        params.add(new BasicNameValuePair("tiempo", tiempo));
        params.add(new BasicNameValuePair("ciudad", ciudad));
        params.add(new BasicNameValuePair("direccion", direccion));
        params.add(new BasicNameValuePair("precio", precio));
 
        // pidiendo JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        // return json
        return json;
    }
    
    /**
     * Funcion editar publicacion
     * envia info de cambios de publicacion
     * */
    public JSONObject editarPub(Context context, String cod_publicacion, String titulo, String precio, String descripcion, String direccion){
        // Building Parameters
    	DatabaseHandler db=new DatabaseHandler(context);
    	HashMap<String, String> user=new HashMap<String, String>();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        user=db.getUserDetails();
        params.add(new BasicNameValuePair("tag", editarPub_tag));
        params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("cod_publicacion", cod_publicacion));
        params.add(new BasicNameValuePair("titulo", titulo));
        params.add(new BasicNameValuePair("descripcion", descripcion));
        params.add(new BasicNameValuePair("direccion", direccion));
        params.add(new BasicNameValuePair("precio", precio));
 
        // pidiendo JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(URL, params);
        // return json
        return json;
    }
    
    
    /**
     * Funcion subir imagen
     * Sube imagen al srevidor
     * */
    public JSONObject subirImg(String ba, String cod_pub){
    	 List<NameValuePair> params = new ArrayList<NameValuePair>();
    	 params.add(new BasicNameValuePair("tag", subirImg_tag));
    	 params.add(new BasicNameValuePair("cod_publicacion", cod_pub));
    	 params.add(new BasicNameValuePair("imagen", ba));
    	 
    	 //pidiendo JSON Object
    	 JSONObject json=jsonParser.getJSONFromUrl(URL, params);
    	 //return json
    	 return json;
    }
    
    /**
     * Funcion subir ubicacion
     * Envia info de ubicacion de domicilio
     * */
    public JSONObject subirUbicacion(String cod_pub, String latitud, String longitud){
   	 List<NameValuePair> params = new ArrayList<NameValuePair>();
   	 params.add(new BasicNameValuePair("tag", subirUbi_tag));
   	 params.add(new BasicNameValuePair("cod_publicacion", cod_pub));
   	 params.add(new BasicNameValuePair("latitud", latitud));
   	 params.add(new BasicNameValuePair("longitud", longitud));
   	 
   	 //pidiendo JSON Object
   	 JSONObject json=jsonParser.getJSONFromUrl(URL, params);
   	 //return json
   	 return json;
   }
    
    /**
     * Funcion obtener informacion de publicacion
     * Recibe info de la publicacion requerida
     * */
    public JSONObject getPub(Context context, String cod_pub){
    	DatabaseHandler db=new DatabaseHandler(context);
    	HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
      	List<NameValuePair> params = new ArrayList<NameValuePair>();
      	params.add(new BasicNameValuePair("tag", getPub_tag));
      	params.add(new BasicNameValuePair("cod_publicacion", cod_pub));  
      	params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
      	//pidiendo JSON Object
      	JSONObject json=jsonParser.getJSONFromUrl(URL, params);
      	//return json
      	return json;
    }
    
    /**
     * Funcion descargar imagen
     * 
     * */
    public Bitmap loadImageFromUrl(String cod_pub) {
        InputStream inputStream;Bitmap b;
        try {
                inputStream = (InputStream) new java.net.URL(URL_IMG+cod_pub+".jpg").getContent();
                BitmapFactory.Options bpo=  new BitmapFactory.Options();
                bpo.inSampleSize=2;
               b=BitmapFactory.decodeStream(new PatchInputStream(inputStream), null,bpo );
                return  b;
        } catch (IOException e) {
        	return null;
            }
    }
    public class PatchInputStream extends FilterInputStream {
        public PatchInputStream(InputStream in) {
          super(in);
        }
        public long skip(long n) throws IOException {
          long m = 0L;
          while (m < n) {
            long _m = in.skip(n-m);
            if (_m == 0L) break;
            m += _m;
          }
          return m;
        }
      }
    
    /**
     * Funcion agragar publicvacion a favoritos
     * Agrega una publicacion a la lista de favoritos
     * */
    public JSONObject addRemFav(Context context, String cod_pub, String funcion){
    	DatabaseHandler db=new DatabaseHandler(context);
    	HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
	 	List<NameValuePair> params = new ArrayList<NameValuePair>();
	 	params.add(new BasicNameValuePair("tag", addRemFav_tag));
	 	params.add(new BasicNameValuePair("funcion", funcion));
	 	params.add(new BasicNameValuePair("cod_publicacion", cod_pub));
	 	params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
	 	//pidiendo JSON Object
	 	JSONObject json=jsonParser.getJSONFromUrl(URL, params);
	 	//return json
	 	return json;
   }
    
    /**
     * Funcion para obtener la ubicacion de una publicacion 
     * */
    public JSONObject getUbi(String cod_pub){
    	List<NameValuePair> params = new ArrayList<NameValuePair>();
	 	params.add(new BasicNameValuePair("tag", getUb_tag));
	 	params.add(new BasicNameValuePair("cod_publicacion", cod_pub));
	 	//pidiendo JSON Object
	 	JSONObject json=jsonParser.getJSONFromUrl(URL, params);
	 	//return json
	 	return json;
    }
    
    /**
     * Funcion obtener favoritos
     * */
    public JSONObject getFavoritos(Context context, Integer pagina){
    	DatabaseHandler db=new DatabaseHandler(context);
    	HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
	 	List<NameValuePair> params = new ArrayList<NameValuePair>();
	 	params.add(new BasicNameValuePair("tag", favoritos_tag));
	 	params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("pagina", ""+pagina));
	 	//pidiendo JSON Object
	 	JSONObject json=jsonParser.getJSONFromUrl(URL, params);
	 	//return json
	 	return json;
   }
    
    /**
     * Funcion obtener publicaciones hechas por el usuario
     * */
    public JSONObject getMisPublicaciones(Context context, Integer pagina){
    	DatabaseHandler db=new DatabaseHandler(context);
    	HashMap<String, String> user=new HashMap<String, String>();
    	user=db.getUserDetails();
	 	List<NameValuePair> params = new ArrayList<NameValuePair>();
	 	params.add(new BasicNameValuePair("tag", misPublicaciones_tag));
	 	params.add(new BasicNameValuePair("cod_usuario", user.get("cod_usuario")));
        params.add(new BasicNameValuePair("nombre_usuario", user.get("nombre_usuario")));
        params.add(new BasicNameValuePair("pagina", ""+pagina));
	 	//pidiendo JSON Object
	 	JSONObject json=jsonParser.getJSONFromUrl(URL, params);
	 	//return json
	 	return json;
   } 
 
}